JPA Inheritance Mapping হল একটি কৌশল যা Inheritance (উত্তরণ) কনসেপ্টের মাধ্যমে একাধিক টেবিলের মধ্যে সম্পর্ক তৈরি করতে সাহায্য করে। যখন আপনি Inheritance ব্যবহার করেন, তখন একটি Superclass (সুপার ক্লাস) থাকবে এবং এক বা একাধিক Subclass (সাব ক্লাস) থাকবে। JPA-তে ইনহেরিটেন্স মেপিং আপনাকে এই সম্পর্কটিকে ডেটাবেস টেবিলের মাধ্যমে বাস্তবায়ন করতে সহায়তা করে।
JPA তে ইনহেরিটেন্স মেপিংয়ের তিনটি প্রধান কৌশল রয়েছে:
- Single Table Inheritance (একক টেবিল ইনহেরিটেন্স)
- Joined Table Inheritance (জয়েন টেবিল ইনহেরিটেন্স)
- Table per Class Inheritance (প্রতিটি ক্লাসের জন্য একটি টেবিল)
এই টিউটোরিয়ালে আমরা Spring Boot JPA ব্যবহার করে প্রতিটি ইনহেরিটেন্স মেপিং কৌশল বিশ্লেষণ করব এবং উদাহরণের মাধ্যমে দেখাব।
1. Single Table Inheritance
এই কৌশলে, সমস্ত সুপার ক্লাস এবং সাব ক্লাসের ডেটা একটি টেবিলেই সংরক্ষিত হয়। সব ফিল্ড একই টেবিলের মধ্যে থাকে, এবং প্রতিটি রেকর্ডে একটি ডিসটিংগুইশিং কলাম থাকে যা ক্লাসের ধরন নির্দেশ করে।
উদাহরণ: Single Table Inheritance
Super Class: Employee
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "employee_type", discriminatorType = DiscriminatorType.STRING)
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String address;
// Getters and Setters
}
Sub Class: Manager
import javax.persistence.*;
@Entity
@DiscriminatorValue("Manager")
public class Manager extends Employee {
private String department;
// Getters and Setters
}
Sub Class: Developer
import javax.persistence.*;
@Entity
@DiscriminatorValue("Developer")
public class Developer extends Employee {
private String programmingLanguage;
// Getters and Setters
}
এখানে, Employee ক্লাস একটি superclass হিসাবে কাজ করছে এবং Manager এবং Developer ক্লাস দুটি subclass হিসাবে কাজ করছে। @Inheritance(strategy = InheritanceType.SINGLE_TABLE) অ্যানোটেশন দিয়ে স্প্রিং স্পষ্টভাবে নির্দেশ করে যে সব ডেটা একটি টেবিলেই সংরক্ষিত হবে। @DiscriminatorColumn দ্বারা একে আলাদা করা হয় এবং @DiscriminatorValue এর মাধ্যমে সাব ক্লাসের ধরন নির্ধারণ করা হয়।
2. Joined Table Inheritance
এই কৌশলে, প্রতি ক্লাসের জন্য আলাদা আলাদা টেবিল তৈরি হয়, তবে টেবিলগুলোর মধ্যে সম্পর্ক থাকে। Superclass এর টেবিল শুধুমাত্র কমন ফিল্ডগুলিকে ধারণ করবে এবং Subclass এর টেবিলগুলি তাদের নিজস্ব ফিল্ড ধারণ করবে। টেবিলগুলির মধ্যে সম্পর্ক foreign key এর মাধ্যমে তৈরি হয়।
উদাহরণ: Joined Table Inheritance
Super Class: Employee
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String address;
// Getters and Setters
}
Sub Class: Manager
import javax.persistence.*;
@Entity
public class Manager extends Employee {
private String department;
// Getters and Setters
}
Sub Class: Developer
import javax.persistence.*;
@Entity
public class Developer extends Employee {
private String programmingLanguage;
// Getters and Setters
}
এই কৌশলে, Employee টেবিলটি শুধুমাত্র id, name, এবং address ফিল্ড ধারণ করবে, আর Manager টেবিলটি department ফিল্ড এবং Developer টেবিলটি programmingLanguage ফিল্ড ধারণ করবে। Joined স্ট্র্যাটেজি ব্যবহারের মাধ্যমে Employee টেবিল এবং তার subclasses (e.g., Manager, Developer) আলাদা টেবিল হতে হবে, তবে তাদের মধ্যে সম্পর্ক থাকে foreign key এর মাধ্যমে।
3. Table per Class Inheritance
এই কৌশলে, প্রতিটি ক্লাসের জন্য আলাদা আলাদা টেবিল তৈরি হয় এবং প্রতি টেবিলই নিজের ফিল্ড ধারণ করে, তবে কোনো foreign key সম্পর্ক থাকে না। এই পদ্ধতিতে, একটি ক্লাসের জন্য একটি টেবিল তৈরি হয়, যা শুধুমাত্র সেই ক্লাসের জন্য নির্দিষ্ট ডেটা ধারণ করে।
উদাহরণ: Table per Class Inheritance
Super Class: Employee
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String address;
// Getters and Setters
}
Sub Class: Manager
import javax.persistence.*;
@Entity
public class Manager extends Employee {
private String department;
// Getters and Setters
}
Sub Class: Developer
import javax.persistence.*;
@Entity
public class Developer extends Employee {
private String programmingLanguage;
// Getters and Setters
}
এখানে, Employee, Manager এবং Developer এর জন্য আলাদা আলাদা টেবিল তৈরি হবে। প্রতিটি টেবিল শুধুমাত্র তার ক্লাসের জন্য ডেটা ধারণ করবে। এই ক্ষেত্রে, স্প্রিং ডেটা JPA TABLE_PER_CLASS স্ট্র্যাটেজি ব্যবহার করেছে, যার ফলে Employee, Manager, এবং Developer ক্লাসগুলোর জন্য পৃথক টেবিল তৈরি হবে, তবে কোনো foreign key সম্পর্ক থাকবে না।
সারাংশ
JPA Inheritance Mapping হল একটি শক্তিশালী কৌশল যা ক্লাসের মধ্যে ইনহেরিটেন্স সম্পর্ক তৈরি করতে সাহায্য করে এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করে। তিনটি প্রধান ইনহেরিটেন্স স্ট্র্যাটেজি রয়েছে:
- Single Table Inheritance: সব ক্লাসের ডেটা একটি টেবিলেই সংরক্ষিত হয় এবং
@DiscriminatorColumnএর মাধ্যমে আলাদা করা হয়। - Joined Table Inheritance: প্রতিটি ক্লাসের জন্য আলাদা টেবিল থাকে এবং টেবিলগুলির মধ্যে সম্পর্ক থাকে।
- Table per Class Inheritance: প্রতিটি ক্লাসের জন্য আলাদা টেবিল থাকে এবং কোনো foreign key সম্পর্ক থাকে না।
Spring Boot JPA এর মাধ্যমে এই ইনহেরিটেন্স মেপিংগুলো সহজেই বাস্তবায়ন করা যায়, এবং এটি ডেটাবেস ডিজাইন এবং অ্যাপ্লিকেশনের কোড মেইনটেইন করার জন্য খুবই উপকারী।
Read more